Added tests to make sure that the categorization traits work on incomplete types git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@261925 91177308-0d34-0410-b5e6-96231b3b80d8 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/array.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/array.pass.cpp index f4dd356..db91182 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/array.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/array.pass.cpp 
@@ -12,12 +12,13 @@  // array    #include <type_traits> +#include "test_macros.h"    template <class T>  void test_array_imp()  {  static_assert(!std::is_void<T>::value, ""); -#if _LIBCPP_STD_VER > 11 +#if TEST_STD_VER > 11  static_assert(!std::is_null_pointer<T>::value, "");  #endif  static_assert(!std::is_integral<T>::value, ""); @@ -46,10 +47,14 @@  typedef char array[3];  typedef const char const_array[3];  typedef char incomplete_array[]; +struct incomplete_type;    int main()  {  test_array<array>();  test_array<const_array>();  test_array<incomplete_array>(); + +// LWG#2581 + static_assert(!std::is_array<incomplete_type>::value, "");  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/class.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/class.pass.cpp index ac5d6e5..164e922 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/class.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/class.pass.cpp 
@@ -12,12 +12,13 @@  // class    #include <type_traits> +#include "test_macros.h"    template <class T>  void test_class_imp()  {  static_assert(!std::is_void<T>::value, ""); -#if _LIBCPP_STD_VER > 11 +#if TEST_STD_VER > 11  static_assert(!std::is_null_pointer<T>::value, "");  #endif  static_assert(!std::is_integral<T>::value, ""); @@ -47,7 +48,12 @@  {  };   +struct incomplete_type; +  int main()  {  test_class<Class>(); + +// LWG#2581 + static_assert( std::is_class<incomplete_type>::value, "");  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/enum.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/enum.pass.cpp index 7c9c78f..519d441 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/enum.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/enum.pass.cpp 
@@ -12,12 +12,13 @@  // enum    #include <type_traits> +#include "test_macros.h"    template <class T>  void test_enum_imp()  {  static_assert(!std::is_void<T>::value, ""); -#if _LIBCPP_STD_VER > 11 +#if TEST_STD_VER > 11  static_assert(!std::is_null_pointer<T>::value, "");  #endif  static_assert(!std::is_integral<T>::value, ""); @@ -44,8 +45,12 @@  }    enum Enum {zero, one}; +struct incomplete_type;    int main()  {  test_enum<Enum>(); + +// LWG#2581 + static_assert(!std::is_enum<incomplete_type>::value, "");  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/floating_point.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/floating_point.pass.cpp index 2866449..207d9e5 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/floating_point.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/floating_point.pass.cpp 
@@ -12,12 +12,13 @@  // floating_point    #include <type_traits> +#include "test_macros.h"    template <class T>  void test_floating_point_imp()  {  static_assert(!std::is_void<T>::value, ""); -#if _LIBCPP_STD_VER > 11 +#if TEST_STD_VER > 11  static_assert(!std::is_null_pointer<T>::value, "");  #endif  static_assert(!std::is_integral<T>::value, ""); @@ -43,9 +44,14 @@  test_floating_point_imp<const volatile T>();  }   +struct incomplete_type; +  int main()  {  test_floating_point<float>();  test_floating_point<double>();  test_floating_point<long double>(); + +// LWG#2581 + static_assert(!std::is_floating_point<incomplete_type>::value, "");  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/function.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/function.pass.cpp index b1df4f2..e3b0799 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/function.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/function.pass.cpp 
@@ -12,13 +12,14 @@  // function    #include <type_traits> +#include "test_macros.h"    using namespace std;    class Class {};    enum Enum1 {}; -#if __cplusplus >= 201103L +#if TEST_STD_VER >= 11  enum class Enum2 : int {};  #else  enum Enum2 {}; @@ -28,7 +29,7 @@  void test()  {  static_assert(!std::is_void<T>::value, ""); -#if _LIBCPP_STD_VER > 11 +#if TEST_STD_VER > 11  static_assert(!std::is_null_pointer<T>::value, "");  #endif  static_assert(!std::is_integral<T>::value, ""); @@ -64,6 +65,7 @@  test<__VA_ARGS__ volatile &&>(); \  test<__VA_ARGS__ const volatile &&>()   +struct incomplete_type;    int main()  { @@ -75,7 +77,7 @@  TEST_REGULAR( void (int, ...) );  TEST_REGULAR( int (double, ...) );  TEST_REGULAR( int (double, char, ...) ); -#if __cplusplus >= 201103L +#if TEST_STD_VER >= 11  TEST_REF_QUALIFIED( void () );  TEST_REF_QUALIFIED( void (int) );  TEST_REF_QUALIFIED( int (double) ); @@ -85,4 +87,7 @@  TEST_REF_QUALIFIED( int (double, ...) );  TEST_REF_QUALIFIED( int (double, char, ...) );  #endif + +// LWG#2581 + static_assert(!std::is_function<incomplete_type>::value, "");  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/integral.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/integral.pass.cpp index f68ed3e..e9cd36b 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/integral.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/integral.pass.cpp 
@@ -12,12 +12,13 @@  // integral    #include <type_traits> +#include "test_macros.h"    template <class T>  void test_integral_imp()  {  static_assert(!std::is_void<T>::value, ""); -#if _LIBCPP_STD_VER > 11 +#if TEST_STD_VER > 11  static_assert(!std::is_null_pointer<T>::value, "");  #endif  static_assert( std::is_integral<T>::value, ""); @@ -43,6 +44,8 @@  test_integral_imp<const volatile T>();  }   +struct incomplete_type; +  int main()  {  test_integral<bool>(); @@ -62,4 +65,7 @@  test_integral<__int128_t>();  test_integral<__uint128_t>();  #endif + +// LWG#2581 + static_assert(!std::is_integral<incomplete_type>::value, "");  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_array.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_array.pass.cpp index 72955de..5285886 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_array.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_array.pass.cpp 
@@ -67,6 +67,7 @@  };    enum Enum {zero, one}; +struct incomplete_type;    typedef void (*FunctionPtr)();   @@ -89,5 +90,5 @@  test_is_not_array<Empty>();  test_is_not_array<bit_zero>();  test_is_not_array<NotEmpty>(); - test_is_not_array<Abstract>(); + test_is_not_array<incomplete_type>(); // LWG#2581  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_class.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_class.pass.cpp index 97671e7..3c1a218 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_class.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_class.pass.cpp 
@@ -67,6 +67,7 @@  };    enum Enum {zero, one}; +struct incomplete_type;    typedef void (*FunctionPtr)();   @@ -76,6 +77,7 @@  test_is_class<bit_zero>();  test_is_class<NotEmpty>();  test_is_class<Abstract>(); + test_is_class<incomplete_type>();    #if TEST_STD_VER >= 11  // In C++03 we have an emulation of std::nullptr_t 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_enum.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_enum.pass.cpp index 481260e..2603bdf 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_enum.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_enum.pass.cpp 
@@ -67,6 +67,7 @@  };    enum Enum {zero, one}; +struct incomplete_type;    typedef void (*FunctionPtr)();   @@ -90,4 +91,5 @@  test_is_not_enum<NotEmpty>();  test_is_not_enum<Abstract>();  test_is_not_enum<FunctionPtr>(); + test_is_not_enum<incomplete_type>();  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_floating_point.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_floating_point.pass.cpp index de9c146..7e19c06 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_floating_point.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_floating_point.pass.cpp 
@@ -67,6 +67,7 @@  };    enum Enum {zero, one}; +struct incomplete_type;    typedef void (*FunctionPtr)();   @@ -98,4 +99,5 @@  test_is_not_floating_point<Abstract>();  test_is_not_floating_point<Enum>();  test_is_not_floating_point<FunctionPtr>(); + test_is_not_floating_point<incomplete_type>();  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_function.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_function.pass.cpp index 9a1d821..cb5849f 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_function.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_function.pass.cpp 
@@ -67,6 +67,7 @@  };    enum Enum {zero, one}; +struct incomplete_type;    typedef void (*FunctionPtr)();   @@ -95,4 +96,5 @@  test_is_not_function<NotEmpty>();  test_is_not_function<Abstract>();  test_is_not_function<Abstract*>(); + test_is_not_function<incomplete_type>();  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_integral.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_integral.pass.cpp index 86b63c5..0999762 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_integral.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_integral.pass.cpp 
@@ -67,6 +67,7 @@  };    enum Enum {zero, one}; +struct incomplete_type;    typedef void (*FunctionPtr)();   @@ -101,4 +102,5 @@  test_is_not_integral<bit_zero>();  test_is_not_integral<NotEmpty>();  test_is_not_integral<Abstract>(); + test_is_not_integral<incomplete_type>();  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_lvalue_reference.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_lvalue_reference.pass.cpp index 0e59f71..41b8d44 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_lvalue_reference.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_lvalue_reference.pass.cpp 
@@ -69,6 +69,7 @@  };    enum Enum {zero, one}; +struct incomplete_type;    typedef void (*FunctionPtr)();   @@ -92,4 +93,5 @@  test_is_not_lvalue_reference<bit_zero>();  test_is_not_lvalue_reference<NotEmpty>();  test_is_not_lvalue_reference<Abstract>(); + test_is_not_lvalue_reference<incomplete_type>();  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_member_object_pointer.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_member_object_pointer.pass.cpp index 8da411d..9498edc 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_member_object_pointer.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_member_object_pointer.pass.cpp 
@@ -67,6 +67,7 @@  };    enum Enum {zero, one}; +struct incomplete_type;    typedef void (*FunctionPtr)();   @@ -94,4 +95,5 @@  test_is_not_member_object_pointer<bit_zero>();  test_is_not_member_object_pointer<NotEmpty>();  test_is_not_member_object_pointer<Abstract>(); + test_is_not_member_object_pointer<incomplete_type>();  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_member_pointer.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_member_pointer.pass.cpp index 19a74b0..d4043f4 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_member_pointer.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_member_pointer.pass.cpp 
@@ -67,6 +67,7 @@  };    enum Enum {zero, one}; +struct incomplete_type;    typedef void (*FunctionPtr)();   @@ -95,4 +96,5 @@  test_is_not_member_pointer<bit_zero>();  test_is_not_member_pointer<NotEmpty>();  test_is_not_member_pointer<Abstract>(); + test_is_not_member_pointer<incomplete_type>();  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_null_pointer.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_null_pointer.pass.cpp index 80f563e..f575763 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_null_pointer.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_null_pointer.pass.cpp 
@@ -69,6 +69,7 @@  };    enum Enum {zero, one}; +struct incomplete_type;    typedef void (*FunctionPtr)();   @@ -92,4 +93,5 @@  test_is_not_null_pointer<bit_zero>();  test_is_not_null_pointer<NotEmpty>();  test_is_not_null_pointer<Abstract>(); + test_is_not_null_pointer<incomplete_type>();  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_pointer.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_pointer.pass.cpp index a901aed..257719e 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_pointer.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_pointer.pass.cpp 
@@ -67,6 +67,7 @@  };    enum Enum {zero, one}; +struct incomplete_type;    typedef void (*FunctionPtr)();   @@ -91,4 +92,5 @@  test_is_not_pointer<bit_zero>();  test_is_not_pointer<NotEmpty>();  test_is_not_pointer<Abstract>(); + test_is_not_pointer<incomplete_type>();  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_rvalue_reference.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_rvalue_reference.pass.cpp index b7b5268..8963937 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_rvalue_reference.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_rvalue_reference.pass.cpp 
@@ -69,6 +69,7 @@  };    enum Enum {zero, one}; +struct incomplete_type;    typedef void (*FunctionPtr)();   @@ -92,4 +93,5 @@  test_is_not_rvalue_reference<bit_zero>();  test_is_not_rvalue_reference<NotEmpty>();  test_is_not_rvalue_reference<Abstract>(); + test_is_not_rvalue_reference<incomplete_type>();  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_union.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_union.pass.cpp index 307fedb..415d9a7 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_union.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_union.pass.cpp 
@@ -67,6 +67,7 @@  };    enum Enum {zero, one}; +struct incomplete_type;    typedef void (*FunctionPtr)();   @@ -90,4 +91,5 @@  test_is_not_union<bit_zero>();  test_is_not_union<NotEmpty>();  test_is_not_union<Abstract>(); + test_is_not_union<incomplete_type>();  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_void.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_void.pass.cpp index 1647666..952a5b7 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/is_void.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/is_void.pass.cpp 
@@ -67,6 +67,7 @@  };    enum Enum {zero, one}; +struct incomplete_type;    typedef void (*FunctionPtr)();   @@ -89,4 +90,5 @@  test_is_not_void<Abstract>();  test_is_not_void<Enum>();  test_is_not_void<FunctionPtr>(); + test_is_not_void<incomplete_type>();  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/lvalue_ref.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/lvalue_ref.pass.cpp index 3b6ccad..4e7bdbf 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/lvalue_ref.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/lvalue_ref.pass.cpp 
@@ -34,8 +34,13 @@  static_assert(!std::is_function<T>::value, "");  }   +struct incomplete_type; +  int main()  {  test_lvalue_ref<int&>();  test_lvalue_ref<const int&>(); + +// LWG#2581 + static_assert(!std::is_lvalue_reference<incomplete_type>::value, "");  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer.pass.cpp index 6f546ef..49db6ab 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer.pass.cpp 
@@ -48,6 +48,8 @@  {  };   +struct incomplete_type; +  int main()  {  test_member_function_pointer<void (Class::*)()>(); @@ -133,4 +135,7 @@  test_member_function_pointer<void (Class::*)(int,...) const volatile &&>();  test_member_function_pointer<void (Class::*)(int, char,...) const volatile &&>();  #endif + +// LWG#2581 + static_assert(!std::is_member_function_pointer<incomplete_type>::value, "");  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer_no_variadics.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer_no_variadics.pass.cpp index e13e586..7afc88f 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer_no_variadics.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer_no_variadics.pass.cpp 
@@ -48,6 +48,8 @@  {  };   +struct incomplete_type; +  int main()  {  test_member_function_pointer<void (Class::*)()>(); @@ -73,4 +75,7 @@  test_member_function_pointer<void (Class::*)(...) volatile>();  test_member_function_pointer<void (Class::*)(int, ...) volatile>();  test_member_function_pointer<void (Class::*)(int, char, ...) volatile>(); + +// LWG#2581 + static_assert(!std::is_member_function_pointer<incomplete_type>::value, "");  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/member_object_pointer.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/member_object_pointer.pass.cpp index 4e6699c..4102f99 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/member_object_pointer.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/member_object_pointer.pass.cpp 
@@ -12,12 +12,13 @@  // member_object_pointer    #include <type_traits> +#include "test_macros.h"    template <class T>  void test_member_object_pointer_imp()  {  static_assert(!std::is_void<T>::value, ""); -#if _LIBCPP_STD_VER > 11 +#if TEST_STD_VER > 11  static_assert(!std::is_null_pointer<T>::value, "");  #endif  static_assert(!std::is_integral<T>::value, ""); @@ -47,7 +48,12 @@  {  };   +struct incomplete_type; +  int main()  {  test_member_object_pointer<int Class::*>(); + +// LWG#2581 + static_assert(!std::is_member_object_pointer<incomplete_type>::value, "");  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/nullptr.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/nullptr.pass.cpp index 1c7a32f..aad9e34 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/nullptr.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/nullptr.pass.cpp 
@@ -14,8 +14,9 @@    #include <type_traits>  #include <cstddef> // for std::nullptr_t +#include "test_macros.h"   -#if _LIBCPP_STD_VER > 11 +#if TEST_STD_VER > 11  template <class T>  void test_nullptr_imp()  { @@ -44,9 +45,14 @@  test_nullptr_imp<const volatile T>();  }   +struct incomplete_type; +  int main()  {  test_nullptr<std::nullptr_t>(); + +// LWG#2581 + static_assert(!std::is_null_pointer<incomplete_type>::value, "");  }  #else  int main() {} 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/pointer.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/pointer.pass.cpp index 7073c10..72c8e36 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/pointer.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/pointer.pass.cpp 
@@ -12,12 +12,14 @@  // pointer    #include <type_traits> +#include "test_macros.h" +    template <class T>  void test_pointer_imp()  {  static_assert(!std::is_void<T>::value, ""); -#if _LIBCPP_STD_VER > 11 +#if TEST_STD_VER > 11  static_assert(!std::is_null_pointer<T>::value, "");  #endif  static_assert(!std::is_integral<T>::value, ""); @@ -43,10 +45,15 @@  test_pointer_imp<const volatile T>();  }   +struct incomplete_type; +  int main()  {  test_pointer<void*>();  test_pointer<int*>();  test_pointer<const int*>();  test_pointer<void (*)(int)>(); + +// LWG#2581 + static_assert(!std::is_pointer<incomplete_type>::value, "");  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/rvalue_ref.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/rvalue_ref.pass.cpp index 7964424..9451a91 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/rvalue_ref.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/rvalue_ref.pass.cpp 
@@ -12,12 +12,13 @@  // rvalue_ref    #include <type_traits> +#include "test_macros.h"    template <class T>  void test_rvalue_ref()  {  static_assert(!std::is_void<T>::value, ""); -#if _LIBCPP_STD_VER > 11 +#if TEST_STD_VER > 11  static_assert(!std::is_null_pointer<T>::value, "");  #endif  static_assert(!std::is_integral<T>::value, ""); @@ -34,10 +35,15 @@  static_assert(!std::is_function<T>::value, "");  }   +struct incomplete_type; +  int main()  {  #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES  test_rvalue_ref<int&&>();  test_rvalue_ref<const int&&>(); + +// LWG#2581 + static_assert(!std::is_rvalue_reference<incomplete_type>::value, "");  #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/union.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/union.pass.cpp index 6cabb71..5f57323 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/union.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/union.pass.cpp 
@@ -12,12 +12,13 @@  // union    #include <type_traits> +#include "test_macros.h"    template <class T>  void test_union_imp()  {  static_assert(!std::is_void<T>::value, ""); -#if _LIBCPP_STD_VER > 11 +#if TEST_STD_VER > 11  static_assert(!std::is_null_pointer<T>::value, "");  #endif  static_assert(!std::is_integral<T>::value, ""); @@ -49,7 +50,12 @@  double __;  };   +struct incomplete_type; +  int main()  {  test_union<Union>(); + +// LWG#2581 + static_assert(!std::is_union<incomplete_type>::value, "");  } 
diff --git a/test/std/utilities/meta/meta.unary/meta.unary.cat/void.pass.cpp b/test/std/utilities/meta/meta.unary/meta.unary.cat/void.pass.cpp index f20bcf8..f176366 100644 --- a/test/std/utilities/meta/meta.unary/meta.unary.cat/void.pass.cpp +++ b/test/std/utilities/meta/meta.unary/meta.unary.cat/void.pass.cpp 
@@ -12,12 +12,13 @@  // void    #include <type_traits> +#include "test_macros.h"    template <class T>  void test_void_imp()  {  static_assert( std::is_void<T>::value, ""); -#if _LIBCPP_STD_VER > 11 +#if TEST_STD_VER > 11  static_assert(!std::is_null_pointer<T>::value, "");  #endif  static_assert(!std::is_integral<T>::value, ""); @@ -43,7 +44,12 @@  test_void_imp<const volatile T>();  }   +struct incomplete_type; +  int main()  {  test_void<void>(); + +// LWG#2581 + static_assert(!std::is_void<incomplete_type>::value, "");  }